Exit<A, E>
Effect<A, E, R>の結果を表現する型
Effect の実行結果が、成功したのか、失敗したのかを表現する
https://effect.website/docs/data-types/exit/
型
Exit<A, E> の2つの状態
Exit.Success<A>
成功したとき
成功値 A を持つ
Exit.Failure<E>
失敗したとき
失敗の理由(Cause (effect))を持つ
code:ts
// 成功例
const successExit = Exit.succeed(42) // Exit<number, never>
// 失敗例
const failureExit = Exit.failCause(Cause.fail("error")) // Exit<never, string>
GPT-4.icon
Exit.succeed
Effectが正常に終わって値が得られた場合、Exit.succeed(value) を使います。
code:ts
const successExit = Exit.succeed(42)
console.log(successExit)
// => { _tag: "Success", value: 42 }
Exit.failCause
Effectが失敗したときは Exit.failCause(Cause.fail(error)) を使います。
code:ts
const failureExit = Exit.failCause(Cause.fail("Something went wrong"))
console.log(failureExit)
// => { _tag: "Failure", cause: { _tag: "Fail", failure: "Something went wrong" } }
Exit.match
パターンマッチ
Exit.match を使うことで、成功・失敗の両方を安全にハンドリングできます。
code:ts
const exit = Effect.runSyncExit(Effect.succeed(1))
const message = Exit.match(exit, {
onSuccess: (value) => 成功: ${value},
onFailure: (cause) => 失敗: ${Cause.pretty(cause)}
})
console.log(message)
// => 成功: 1
🔁 Exit と Either の違い
Exit<A, E> は概念的には Either<A, Cause<E>> に似ていますが、Cause により失敗の情報がずっとリッチです。
単なる Left<Error> ではなく、「なぜ失敗したか」を構造的に表現できます。
🔄 Exit は Effect の一種
Exit.succeed(x) は Effect.succeed(x) と同じように使えます。
Exit.failCause(cause) も Effect.failCause(cause) と同じように使えます。
つまり、Exit は 「すでに終わった Effect」(定数)だと思っておくと良いです。